/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package colloque.helpers;

import colloque.Expose;
import colloque.HibernateUtil;
import colloque.Utilisateur;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author James
 */
public class UtilisateurHelper {

    Session session = null;

    /**
     *
     */
    public UtilisateurHelper() {
        this.session = HibernateUtil.getSessionFactory().getCurrentSession();
    }

    /**
     * Retourne l'utilisateur par son courriel
     * 
     * @param courriel
     * @return
     * @throws Exception
     */
    public Utilisateur getUtilisateurByCourriel(String courriel) throws Exception {
        Utilisateur utilisateur = new Utilisateur();
        try {
            Transaction tx = session.beginTransaction();
            Query q = session.createQuery("from Utilisateur as U where U.utilisateurcourriel ='" + courriel + "'");
            utilisateur = (Utilisateur) q.uniqueResult();
            // session.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return utilisateur;

    }

    /**
     * Retourne l'utilisateur connecté
     * 
     * @param request
     * @return
     */
    public Utilisateur getUtilisateurCourant(HttpServletRequest request) {
        Utilisateur utilisateur = new Utilisateur();
        utilisateur = (Utilisateur) request.getSession().getAttribute("sessionUtilisateur");
        try {
            Transaction tx = session.beginTransaction();
            Query q = session.createQuery("from Utilisateur as U where U.utilisateurid ='" + utilisateur.getUtilisateurid() + "'");
            utilisateur = (Utilisateur) q.uniqueResult();
            // session.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return utilisateur;

    }

    /**
     * Retourne l'utilisateur pour un courriel et mdp donné
     * 
     * @param courriel
     * @param password
     * @return
     * @throws Exception
     */
    public Utilisateur getUtilisateurByCourrielAndPassword(String courriel, String password) throws Exception {
        Utilisateur utilisateur = new Utilisateur();

        Transaction tx = session.beginTransaction();
        session.clear();
        Query q = session.createQuery("from Utilisateur as U where U.utilisateurcourriel ='" + courriel + "' and U.utilisateurpassword = '" + password + "'");
        utilisateur = (Utilisateur) q.uniqueResult();

        if (utilisateur == null) {
            throw new Exception("L'utilisateur est introuvable");
        }
        return utilisateur;

    }

    /**
     * Retourne la liste des utilisateurs compétents pour un exposé pour un
     * colloque donné
     *
     * @param exposeid
     * @return <List>Utilisateur
     */
    public List<Utilisateur> getUtilisateursCompetentsPourExpose(int exposeid) {
        List<Utilisateur> utilisateurs = new ArrayList<Utilisateur>();
        ExposeHelper expose_helper = new ExposeHelper();
        Expose expose = expose_helper.getExposeById(exposeid);
        try {
            Transaction tx = session.beginTransaction();
            Query q = session.createQuery("select distinct u.utilisateurid, u.utilisateurnom, u.utilisateurprenom from Utilisateur u join u.motCles mc join u.colloques c where mc.motcleid in (select mc.motcleid from MotCle mc join mc.exposes e where e.exposeid = " + expose.getExposeid() + ") and c.colloqueid = " + expose.getColloque().getColloqueid() + " and u.institution.institutionid not like (select ex.utilisateur.institution.institutionid from Expose ex where ex.exposeid = " + expose.getExposeid() + ")");

            if (q.list().isEmpty()) {
                Query q2 = session.createQuery("select distinct u.utilisateurid, u.utilisateurnom, u.utilisateurprenom from Utilisateur u join u.colloques c where c.colloqueid = " + expose.getColloque().getColloqueid() + " and u.institution.institutionid not like (select ex.utilisateur.institution.institutionid from Expose ex where ex.exposeid = " + expose.getExposeid() + ")");
                utilisateurs = q2.list();

            } else {
                utilisateurs = q.list();
            }


            // session.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return utilisateurs;
    }

    /**
     * Retourne la liste des utilisateurs compétents dans les mots clés d'un colloque
     * 
     * @param colloqueid
     * @return
     */
    public List<Utilisateur> getUtilisateursCompetentsPourColloque(int colloqueid) {
        List<Utilisateur> utilisateurs = new ArrayList<Utilisateur>();
        try {
            Transaction tx = session.beginTransaction();
            Query q = session.createQuery("select distinct u from Utilisateur u join u.motCles umc where umc.motcleid in (select cmc.motcleid from Colloque c join c.motcles cmc where c.colloqueid = "+ colloqueid + ")");
            utilisateurs = q.list();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return utilisateurs;
    }
}
